import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
  // 根据不同的环境去拼接url地址
  // 默认会添加 http://127.0.0.1:9528
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // 是否需要携带凭证
  // withCredentials: true, // send cookies when cross-domain requests
  // 超时的时间
  timeout: 5000,
})

// request interceptor => 请求拦截器
service.interceptors.request.use(
  (config) => {
    // do something before request is sent
    // 在发送请求之前做一些事
    if (getToken()) {
      // 每一个请求都要携带token
      // let each request carry token
      // ['X-Token']是自定义的请求头的键
      // ['X-Token'] is a custom headers key
      // 请根据实际情况进行修改
      // please modify it according to the actual situation
      config.headers['Authorization'] = getToken()
    }
    return config
  },
  (error) => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  },
)

// response interceptor => 响应拦截器
service.interceptors.response.use((res) => {
  // 1、统一对后端的数据进行解构
  let {
    data: { data },
    meta,
  } = res
  // 2、如果data有值 则直接返回
  if (data) {
    return data
  }else {
    // 弹窗提示
    Message({
      // 提示内容
      message: meta.msg || 'Error',
      // 提示类型
      type: 'error',
      // 持续时间
      duration: 5 * 1000,
    })
    // 返回失败的promise
    return Promise.reject(new Error(res.message || 'Error'))
  }
}, err => {
  // token失效的情况
  if(err.response.status === 401){
    Message({
      message: 'token失效 请重新登录',
      type: 'error',
      duration: 5 * 1000,
    })
    return Promise.reject(err)
  }
  // 其它情况
  Message({
    message: '出了点小问题 请联系管理员',
    type: 'error',
    duration: 5 * 1000,
  })
  return Promise.reject(err)
})

export default service
